package com.ajun.service;

import cn.hutool.core.util.IdUtil;
import com.ajun.common.rabbit.QueueConstants;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.MessagePostProcessor;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * 订单业务
 *
 * @author AJun
 * @date 2021-07-14
 */
@Slf4j
@Service
public class OrderService {

    @Resource
    private RabbitTemplate rabbitTemplate;

    /**
     * 用户下单
     *
     * @param userId    用户 id
     * @param productId 产品 id
     * @param num       产品数量
     */
    public void makeOrder(String userId, String productId, int num) {
        // 根据商品 Id 查询商品库存是否充足
        // 保存订单
        String orderId = IdUtil.simpleUUID();
        log.info("{} 用户的 {} 商品订单生成成功, orderId:{}", userId, productId, orderId);
        // 使用 MQ 来进行消息分发
        /*
            exchange – the name of the exchange
            routingKey – the routing key
            message – a message to send
         */
        rabbitTemplate.convertAndSend(QueueConstants.ORDER_FANOUT_EXCHANGE, "", orderId);
    }

    /**
     * 用户下单
     *
     * @param userId    用户 id
     * @param productId 产品 id
     * @param num       产品数量
     */
    public void makeOrderByDirect(String userId, String productId, int num) {
        // 根据商品 Id 查询商品库存是否充足
        // 保存订单
        String orderId = IdUtil.simpleUUID();
        log.info("{} 用户的 {} 商品订单生成成功, orderId:{}", userId, productId, orderId);
        // 使用 MQ 来进行消息分发
        rabbitTemplate.convertAndSend(QueueConstants.ORDER_DIRECT_EXCHANGE, QueueConstants.EMAIL_DIRECT_KEY, orderId);
        rabbitTemplate.convertAndSend(QueueConstants.ORDER_DIRECT_EXCHANGE, QueueConstants.SMS_DIRECT_KEY, orderId);
        rabbitTemplate.convertAndSend(QueueConstants.ORDER_DIRECT_EXCHANGE, QueueConstants.NOTE_DIRECT_KEY, orderId);
    }

    /**
     * 用户下单
     *
     * @param userId    用户 id
     * @param productId 产品 id
     * @param num       产品数量
     */
    public void makeOrderByTopic(String userId, String productId, int num) {
        // 根据商品 Id 查询商品库存是否充足
        // 保存订单
        String orderId = IdUtil.simpleUUID();
        log.info("{} 用户的 {} 商品订单生成成功, orderId:{}", userId, productId, orderId);
        // 使用 MQ 来进行消息分发(note & email)
        rabbitTemplate.convertAndSend(QueueConstants.ORDER_TOPIC_EXCHANGE, "note.email", orderId);
    }

    /**
     * 用户下单
     *
     * @param userId    用户 id
     * @param productId 产品 id
     * @param num       产品数量
     */
    public void makeOrderByTtl(String userId, String productId, int num) {
        // 根据商品 Id 查询商品库存是否充足
        // 保存订单
        String orderId = IdUtil.simpleUUID();
        log.info("{} 用户的 {} 商品订单生成成功, orderId:{}", userId, productId, orderId);
        // 使用 MQ 来进行消息分发
        rabbitTemplate.convertAndSend(QueueConstants.ORDER_TTL_EXCHANGE, QueueConstants.EMAIL_TTL_KEY, orderId);
        rabbitTemplate.convertAndSend(QueueConstants.ORDER_TTL_EXCHANGE, QueueConstants.SMS_TTL_KEY, orderId);
        rabbitTemplate.convertAndSend(QueueConstants.ORDER_TTL_EXCHANGE, QueueConstants.NOTE_TTL_KEY, orderId);
    }

    /**
     * 用户下单
     *
     * @param userId    用户 id
     * @param productId 产品 id
     * @param num       产品数量
     */
    public void makeOrderByTtlMessage(String userId, String productId, int num) {
        // 根据商品 Id 查询商品库存是否充足
        // 保存订单
        String orderId = IdUtil.simpleUUID();
        log.info("{} 用户的 {} 商品订单生成成功, orderId:{}", userId, productId, orderId);
        // 使用 MQ 来进行消息分发,给消息设置过期时间 ttl
        MessagePostProcessor messagePostProcessor = message -> {
            message.getMessageProperties().setExpiration("5000");
            message.getMessageProperties().setContentEncoding("UTF-8");
            message.getMessageProperties().setContentType(MessageProperties.CONTENT_TYPE_JSON);
            return message;
        };
        rabbitTemplate.convertAndSend(QueueConstants.ORDER_TTL_MSG_EXCHANGE, QueueConstants.EMAIL_TTL_MSG_KEY, orderId, messagePostProcessor);
        rabbitTemplate.convertAndSend(QueueConstants.ORDER_TTL_MSG_EXCHANGE, QueueConstants.SMS_TTL_MSG_KEY, orderId, messagePostProcessor);
        rabbitTemplate.convertAndSend(QueueConstants.ORDER_TTL_MSG_EXCHANGE, QueueConstants.NOTE_TTL_MSG_KEY, orderId, messagePostProcessor);
    }

    /**
     * 用户下单
     *
     * @param userId    用户 id
     * @param productId 产品 id
     * @param num       产品数量
     */
    public void makeOrderByDlx(String userId, String productId, int num) {
        // 根据商品 Id 查询商品库存是否充足
        // 保存订单
        String orderId = IdUtil.simpleUUID();
        log.info("{} 用户的 {} 商品订单生成成功, orderId:{}", userId, productId, orderId);
        // 使用 MQ 来进行消息分发
        rabbitTemplate.convertAndSend(QueueConstants.DLX_TEST_EXCHANGE, QueueConstants.DLX_TEST_KEY, orderId);
    }
}
